00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _opt_variable_set_hpp_
00019 #define _opt_variable_set_hpp_
00020
00021 #include <vector>
00022 #include <macdecls.h>
00023 #include "boost/smart_ptr/shared_ptr.hpp"
00024 #include "gridpack/timer/coarse_timer.hpp"
00025 #include "gridpack/network/base_network.hpp"
00026 #include "gridpack/component/base_component.hpp"
00027 #include "gridpack/component/optimization_ifc.hpp"
00028 #include <ga.h>
00029
00030
00031
00032
00033
00034 namespace gridpack{
00035 namespace optimization{
00036
00037 template <class _network>
00038 class OptVariableSet
00039 {
00040 public:
00041
00042
00043
00044
00045 struct { int type;
00046 int bus_id;
00047 int bus1_id;
00048 int bus2_id;
00049 double dmin;
00050 double dmax;
00051 int imin;
00052 int imax;
00053 } OptVar;
00054
00055
00056
00057
00058
00059 OptVariableSet(NetworkPtr network)
00060 {
00061 p_hasData = false;
00062 }
00063
00064
00065
00066
00067 ~OptVariableSet(void)
00068 {
00069 if (p_hasData) {
00070 GA_Deregister_type(p_gaType);
00071 GA_Destroy(p_gdata);
00072 }
00073 }
00074
00075
00076
00077
00078
00079 void init()
00080 {
00081 p_variables.clear();
00082 int numBus = p_network->numBuses();
00083 int numBranch = p_network->numBranches();
00084 int i, j, nvar, it;
00085 gridpack::component::OptimizationInterface *opt;
00086
00087 for (i=0; i<numBus; i++) {
00088 if (p_network->getActiveBus(i)) {
00089 opt = dynamic_cast<gridpack::component::OptimizationInterface*>(
00090 p_network->getBus(i).get());
00091 nvar = opt->numOptVariables();
00092 OptVar var;
00093 for (j=0; j<nvar; j++) {
00094 it = opt->optVariableType(j);
00095 var.type = it;
00096 var.bus_id = p_network->getBus(i)->getOriginalBusIndex();
00097 var.bus1_id = -1;
00098 var.bus2_id = -1;
00099 if (it == OPT_INT) {
00100 opt->optVariableBounds(j,&var.imin,&var.imax);
00101 var.dmin = 0.0;
00102 var.dmax = 0.0;
00103 } else if (it == OPT_DBL) {
00104 opt->optVariableBounds(j,&var.dmin,&var.dmax);
00105 var.imin = 0;
00106 var.imax = 0;
00107 } else if (it == OPT_BOOL) {
00108 var.dmin = 0.0;
00109 var.dmax = 0.0;
00110 var.imin = 0;
00111 var.imax = 0;
00112 } else {
00113
00114 }
00115 p_variables.push_back(var);
00116 }
00117 }
00118 }
00119 for (i=0; i<numBranch; i++) {
00120 if (p_network->getActiveBranch(i)) {
00121 opt = dynamic_cast<gridpack::component::OptimizationInterface*>(
00122 p_network->getBranch(i).get());
00123 nvar = opt->numOptVariables();
00124 OptVar var;
00125 for (j=0; j<nvar; j++) {
00126 it = opt->optVariableType(j);
00127 var.type = it;
00128 var.bus_id = 0;
00129 var.bus1_id = p_network->getBranch(i)->getOriginalBus1Index();
00130 var.bus2_id = p_network->getBranch(i)->getOriginalBus2Index();
00131 if (it == OPT_INT) {
00132 opt->optVariableBounds(j,&var.imin,&var.imax);
00133 var.dmin = 0.0;
00134 var.dmax = 0.0;
00135 } else if (it == OPT_DBL) {
00136 opt->optVariableBounds(j,&var.dmin,&var.dmax);
00137 var.imin = 0;
00138 var.imax = 0;
00139 } else if (it == OPT_BOOL) {
00140 var.dmin = 0.0;
00141 var.dmax = 0.0;
00142 var.imin = 0;
00143 var.imax = 0;
00144 } else {
00145
00146 }
00147 p_variables.push_back(var);
00148 }
00149 }
00150 }
00151
00152
00153 if (p_hasData) {
00154 GA_Deregister_type(p_gaType);
00155 GA_Destroy(p_gdata);
00156 }
00157 p_gaType = NGA_Register_type(sizeof(OptVar));
00158 int nsize = p_variables.size();
00159
00160 int nprocs = GA_Nnodes();
00161 int sizes[nprocs];
00162 int offsets[nprocs];
00163 int me = GA_Nodeid();
00164 for (i=0; i<nprocs; i++) {
00165 sizes[i] = 0;
00166 }
00167 sizes[me] = nsize;
00168 char cplus[2];
00169 strcpy(cplusm,"+");
00170 GA_Igop(sizes,nprocs,cplus);
00171
00172 p_totalVar = 0;
00173 for (i=0; i<nprocs; i++) {
00174 p_totalVar += sizes[i];
00175 }
00176 offsets[0] = 0;
00177 for (i=1; i<nprocs; i++) {
00178 offsets[i] = offsets[i-1]+sizes[i-1];
00179 }
00180 int one = 1;
00181 p_gdata = GA_Create_handle();
00182 NGA_Set_data(p_gdata,one,&p_totalVar,p_gaType);
00183 NGA_Set_irreg_distr(p_gdata,offsets,&nprocs);
00184 NGA_Allocate(p_gdata);
00185
00186 OptVar *buf;
00187 buf = new OptVar[nsize];
00188 int lo = offsets[me];
00189 int hi = lo + nsize - 1;
00190 for (i=0; i<nsize; i++) {
00191 buf[i] = p_variables[i];
00192 }
00193 NGA_Put(p_gdata,&lo,&hi,buf,one);
00194 delete [] buf;
00195 GA_Sync();
00196 }
00197
00198
00199
00200
00201
00202
00203 std::vector<OptVar> getFullVarList()
00204 {
00205 OptVar *buf;
00206 buf = new OptVar[p_totalVar];
00207 int lo = 0;
00208 int hi = p_totalVar-1;
00209 int one = 1;
00210 NGA_Get(p_gdata,&lo,&hi,buf,one);
00211 int i;
00212 std::vector<OptVar> ret;
00213 for (i=0; i<p_totalVar; i++) {
00214 ret.push_back(buf[i]);
00215 }
00216 delete [] buf;
00217 return ret;
00218 }
00219
00220 private:
00221 NetworkPtr p_network;
00222
00223 std::vector<OptVar> p_variables;
00224
00225 int p_gaType;
00226
00227 int p_gdata;
00228
00229 bool p_hasData;
00230
00231 int p_totalVar
00232 };
00233
00234 }
00235 }
00236 #endif